perm filename PALINL.PAS[S1,ALS] blob
sn#483576 filedate 1979-10-26 generic text, type C, neo UTF8
COMMENT ā VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 (* $A+,D+*)
C00012 ENDMK
Cā;
(* $A+,D+*)
program PALINDROME(OUTPUT);
const NUMMAX = 4; PALMAX = 100; NUMLIM = 7; PALLIM = 101;
TABMAX = 500; TABLIM = 501;
var C, I, J, K, L, M, N, NXTOT, TABL, NMAX, NMIN, DCLASS,
NUMVAL, CVAL, CVAL2, PALTOT, PALVAL, CARRY : integer;
CMIN, CMAX : integer;
NUM : array [1..NUMLIM] of integer;
PAL, PAL2 : array [1..PALLIM] of integer;
TAB : array [0..TABLIM] of integer;
TEMP : array [1..5] of integer;
begin (* Main program*)
for I := 1 to NUMMAX do NUM[I] := 0;
NUM [2] := 1; NUMVAL := 2; (* Initial conditions *)
writeln (OUTPUT,
' Palindrome formation tested to a maximum of',PALMAX:4,' digits');
writeln (OUTPUT);
while NUMVAL <= NUMMAX do
begin (*while NUMVAL <= NUMMAX*)
CVAL := NUMVAL div 2;
CVAL2 := CVAL + NUMVAL mod 2;
CMIN := 1;
CMAX := 19; (* gets reduced by 1 below*)
if CVAL > 1 then for I := 2 TO CVAL do
begin
CMIN := CMIN * 19;
CMAX := CMAX * 19;
end;
if (CVAL2 - CVAL) = 1 then
begin
CMIN := CMIN * 10;
CMAX := CMAX * 10;
end;
CMAX := CMAX - 1;
writeln (OUTPUT,'DATA FOR',NUMVAL:2,'-DIGIT DECIMAL NUMBERS');
I := CMAX -CMIN + 1;
writeln(OUTPUT,' WHICH CAN BE GROUPED INTO',I:5,' CLASSES');
writeln(OUTPUT);
writeln(TTY);
writeln (TTY,'DATA FOR',NUMVAL:2,'-DIGIT DECIMAL NUMBERS'); BREAK;
writeln(OUTPUT,'CLASS ADDS RESULTING PALINDROME');
writeln(OUTPUT,
' only classes requiring 4 or more adds are shown');
DCLASS := NUMVAL;
for I := 1 TO PALMAX do PAL[I] := 0;
for I := 0 to TABMAX do TAB[I] := 0; (* palindrome add data *)
PALTOT := 0; (* Count of number of palindromes *)
NXTOT := 0; (* Count of non-palindromes*)
NMAX := 0; (* Maximum adds for a palindrome*)
NMIN := 500; (* Minimun adds for intransigents *)
M := 0;
for C := CMIN to CMAX do
begin (* FOR C := CMIN TO CMAX*)
I := C;
J := CVAL; L := CVAL2 + 1;
if (CVAL2 - CVAL) = 1 then
begin
TEMP[CVAL2] := I mod 10;
NUM[CVAL2] := TEMP[CVAL2];
I := I div 10;
end;
for K := CVAL downto 1 do
begin
TEMP[K] := I mod 19;
if TEMP[K] < 10 then
begin
if K = 1 then
begin
NUM[L] := TEMP[K] -1;
NUM[J] := 1;
end
else
begin
NUM[L] := TEMP[K];
NUM[J] := 0;
end;
end
else
begin
NUM[L] := 9;
NUM[J] := TEMP[K] - 9;
end;
J := J - 1;
L := L + 1;
I := I div 19;
end;
(* for I := 1 to NUMVAL do write(TTY,NUM[I]:1); write(TTY,' '); *)
N := 0; (* To count number of additions *)
for I := 1 to NUMVAL do PAL[I] := NUM[I];
for I := NUMVAL + 1 TO PALMAX do PAL[I] := 0;
PALVAL := NUMVAL;
while PALVAL <= PALMAX do
begin (* while PALVAL <= PALMAX*)
I := 1; J := PALVAL;
while ((PAL[I] = PAL [J]) and (I < J)) do
begin
I := I + 1; J := J - 1;
end;
if I >= J then
begin
TAB[N] := TAB[N] + 1; (*Add to table of depths*)
if N > NMAX then NMAX := N;
if N > 3 then
begin
for J := 1 to CVAL2 do
begin
write (OUTPUT,TEMP[J]:3);
write (TTY,TEMP[J]:3);
end;
write(OUTPUT,N:6,' ');
for I := 1 to PALVAL do
begin
write(OUTPUT,PAL[I]:1);
if I = 72 then
begin
writeln(OUTPUT);
write(OUTPUT,' ');
end;
end;
writeln(OUTPUT);
end;
PALTOT := PALTOT + 1;
PALVAL := PALMAX + 1;
end
else (* Still not a palindrome*)
begin (* try another add*)
J := PALVAL; CARRY := 0;
for I := 1 to PALVAL do
begin (* Add numbers*)
PAL2[I] := PAL[I] + PAL[J] + CARRY;
if PAL2[I] > 9 then
begin
PAL2[I] := PAL2[I] - 10; CARRY := 1;
end
else CARRY := 0;
J := J - 1;
end; (* add numbers*)
if CARRY = 1 then
begin
PALVAL := PALVAL +1; PAL2[PALVAL] := 1;
end;
N := N + 1;
for I := 1 to PALVAL do PAL[I] := PAL2[I];
end;
end (* while PALVAL <= PALMAX*);
end; (* FOR C := CMIN TO CMAX*)
writeln(OUTPUT);
writeln(OUTPUT,'palindromes grouped as to their add depths');
writeln(OUTPUT);
writeln(OUTPUT,
' ADDS CLASSES ADDS CLASSES ADDS CLASSES ADDS CLASSES');
M := 0;
for I := 0 to NMAX do
begin
if TAB[I] <> 0 then
begin
write(OUTPUT,I:10,TAB[I]:6);
M := M + 1;
if (M mod 4) = 0 then writeln(OUTPUT);
end;
end;
writeln(OUTPUT);
writeln(OUTPUT);
NUMVAL := NUMVAL + 1;
end (*while NUMVAL <= NUMMAX*);
end.